.386 


.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\comdlg32.inc 
include \masm32\include\user32.inc
include \MASM32\INCLUDE\shell32.inc
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\comdlg32.lib
includelib \MASM32\LIB\shell32.lib
include \masm32\include\advapi32.inc
includelib \masm32\lib\advapi32.lib
include \masm32\include\comctl32.inc 
includelib \masm32\lib\comctl32.lib 


WinMain				PROTO :DWORD,:DWORD,:DWORD,:DWORD 
SectionPiti 			PROTO
OuvrirFichier			PROTO :DWORD	
EcrireDonnees			PROTO :DWORD
RVAToFileMap			PROTO :DWORD,:DWORD
RVAToOffset 			PROTO :DWORD,:DWORD
DlgProc				PROTO :DWORD,:DWORD,:DWORD,:DWORD
NouvellesFonctions		PROTO	:DWORD, :DWORD
DlgProc2				PROTO :DWORD,:DWORD,:DWORD,:DWORD
DlgProcLV2 				PROTO :DWORD,:DWORD,:DWORD,:DWORD
lcase					PROTO :DWORD
Deci2Char				PROTO :DWORD


SEH struct 
	PrevLink 			dd ?    ; adresse de la structure SEH ci-dessus 
	CurrentHandler 		dd ?    ; adresse du 'exception handler' 
	SafeOffset 			dd ?    ; endroit où est sauvegardé l'offset pour continuer l'exécution 
	PrevEsp 			dd ?    ; l'ancienne valeur dans 'esp'
	PrevEbp 			dd ?    ; ancienne valeur dans 'ebp'
SEH ends


.data 
	AppName 			db "Before the Reverse",0
	ClassName	 		db "SimpleWinClass",0
	MenuName 			db "FirstMenu",0                ; Le nom de notre menu dans le fichier de ressources. 
	MenuName2 			db "FirstMenu2",0
	ofn 				OPENFILENAME <>
	ofnDLL			OPENFILENAME <>
	FilterString 		db "Fichiers Executables (*.exe, *.dll)",0,"*.exe;*.dll",0 
                 			db "All Files",0,"*.*",0,0
	FileOpenError 		db "Impossible d'ouvrir le fichier pour le lire",0 
	FileOpenMappingError	db "Impossible d'ouvrir le fichier pour le mapper en mémoire",0 
	FileMappingError 		db "Le fichier n'a pas pu être mappé en mémoire",0 
	FileValidPE 		db "Fichier de type PE valide",0 
	FileInValidPE 		db "Ceci n'est pas un fichier PE valide",0
	Copie				db "_Sauvegarde.exe",0
	Info				db "Ce programme rajoute les trois fonctions suivantes:",0Ah,0Dh
					db " ",0Ah,0Dh
					db "- GetModuleHandleA",0Ah,0Dh
					db "- GetProcAdress",0Ah,0Dh
					db "- LoadLibraryA",0Ah,0Dh
					db " ",0Ah,0Dh
					db "Ces trois fonctions sont suffisantes pour appeler",0Ah,0Dh
					db "n'importe quelles autres. Cependant, vous pouvez",0Ah,0Dh
					db "aussi en rajouter de nouvelles, directement en les",0Ah,0Dh
					db "plaçant dans le fichier AddFunc.ini",0Ah,0Dh
					db " ",0Ah,0Dh
					db " ",0Ah,0Dh
					db "Voulez-vous créer le fichier AddFunc.ini",0
	InfoA				db "This program add the three following functions :",0Ah,0Dh
					db " ",0Ah,0Dh
					db "- GetModuleHandleA",0Ah,0Dh
					db "- GetProcAdress",0Ah,0Dh
					db "- LoadLibraryA",0Ah,0Dh
					db " ",0Ah,0Dh
					db "This three functions are enough to call anyone",0Ah,0Dh
					db "other. Nevertheless, you can also add more",0Ah,0Dh
					db "others, straight only put them into the",0Ah,0Dh
					db "AddFunc.ini file",0Ah,0Dh
					db " ",0Ah,0Dh
					db " ",0Ah,0Dh
					db "Do you want create the AddFunc.ini file",0
	Createur			db "Programme écrit sous Masm6.0",0Dh,0Ah
					db " ",0Dh,0Ah
					db "                 -[Morgatte]-",0
	CreateurA			db "Program written with Masm6.0",0Dh,0Ah
					db " ",0Dh,0Ah
					db "   -[French Coder : Morgatte]-",0
	ClassNameListView		db "ListViewWinClass",0
	ListViewClassName		db "SysListView32",0
	Heading1			db "Fonction",0
	Heading1A			db "Function",0
	Heading2			db "Call dword ptr [........]",0
	Heading3			db "Module",0
	FileNameSortOrder		dd 0
	SizeSortOrder		dd 0
	
	TestString			db "Hello, everybody",0
	hwndDlg			dd 0            ; Handle to the dialog box
	DlgName			db "MyDialog",0
	DlgNameA			db "MyDialogA",0
	hwndDlg2			dd 0            ; Handle to the dialog box de recherche
	DlgName2			db "Recherche",0
	DlgName2A			db "Search",0
	hwndDlgLV2			dd 0
	DlgNameLV2 			db "RechercheListView",0
	DlgNameLV2A			db "RechercheListViewA",0
	formatHexa			db "%lx",0
	formatDeci			db "%li",0
	formatChar			db "%s",0
	Texte 			db "valeur = %lxh",0	; wsprintf
	erreur			db "<-->",0
	slBouton			db "BUTTON",0
	szMsg				db "Rien",0
	etoile			db "*",0
	ProgressClass		db "msctls_progress32",0
	Loader			db "Loader injecté !!",0
	LoaderA			db "Loader injected !!",0

	

.data?
	hInstance 			HINSTANCE ? 
	CommandLine 		LPSTR ?
	HWNDParent			HANDLE ?
	hFichier			HANDLE ?
	hMenu				HANDLE ?
	hIcon				HANDLE ?
	buffer 			db 512 dup(?)
	Buffer 			db 50 dup (?)		; sert à la fonction wsprintf
	NomProgramme		db 512 dup(?)
	hFile 			dd ? 
	hMapping 			dd ? 
	pMapping 			dd ? 
	ValidPE 			dd ? 
	nombreHChar			db 09 dup (?)
	CheminFichier		db 100 dup (?)
	NumberOfSections		dd ?
	ImageBase			dd ?
	AddressOfEntryPoint	dd ?
	SectionAlignment		dd ?
	FileAlignment		dd ?
	VirtualAddress		dd ?
	PointerToRawData		dd ?
	VirtualSize			dd ?
	SizeOfRawData		dd ?
	hList				dd ?
	hMenuListView		dd ?
	BufferDLL			db 50 dup (?)
	BufferFonction		db 50 dup (?)
	hEdit				HANDLE ?
	hwndProgress		dd ?
	langage			dd ?			; 40Ch = Francais
	NomM				db 20 dup (?)



.const
	IDI_ICON			equ 500  ;	n°ID de l'Icône
	IDM_TEST 			equ 1                    ; (Menu IDs) ou: Les n°Identification des éléments constituants le Menu 
	IDM_OUVRIR 			equ 2
	IDM_INFO			equ 6
	IDM_RCH1			equ 7
	IDM_ICON			equ LVS_ICON
	IDM_SMALLICON		equ LVS_SMALLICON
	IDM_LIST			equ LVS_LIST
	IDM_REPORT			equ LVS_REPORT
	ID_BOUTON			equ 85
	IDC_EDIT			equ 3000
	IDC_BUTTON			equ 3001
	IDC_EXIT			equ 3002
	IDM_RCHLISTVIEW2		equ 3004 
	IDC_PROGRESS		equ 3005
	IDC_DLL			equ 3006


.code
include modules\miniproc.inc
start:
    invoke GetModuleHandle, NULL 
    mov    hInstance,eax 
    invoke GetCommandLine
    mov CommandLine,eax 
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT 
    invoke ExitProcess,eax 
    invoke InitCommonControls




WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
    LOCAL wc:WNDCLASSEX 
    LOCAL msg:MSG 
    LOCAL hwnd:HWND 

    invoke GetUserDefaultLangID
    mov langage, eax				; 40Ch = Français
    and langage, 0000FFFFh

    invoke LoadIcon,hInst,IDI_ICON
    mov hIcon, eax
    mov   wc.hIcon, eax 
    mov   wc.hIconSm,eax 

    mov   wc.cbSize,SIZEOF WNDCLASSEX 
    mov   wc.style, CS_HREDRAW or CS_VREDRAW 
    mov   wc.lpfnWndProc, OFFSET WndProc 
    mov   wc.cbClsExtra,NULL 
    mov   wc.cbWndExtra,NULL 
    push  hInst 
    pop   wc.hInstance 
    mov   wc.hbrBackground,COLOR_WINDOW+10
    mov   wc.lpszMenuName,OFFSET MenuName        ; Place le nom de notre menu ici 
    mov   wc.lpszClassName,OFFSET ClassName
	.if langage != 40Ch
		mov   wc.lpszMenuName,OFFSET MenuName2        ; Place le nom de notre menu ici 
	.endif
    invoke LoadCursor,NULL,IDC_ARROW 
    mov   wc.hCursor,eax
    invoke RegisterClassEx, addr wc 
    invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES, \
			ADDR ClassName, ADDR AppName,\ 
			WS_OVERLAPPED or WS_SYSMENU, \		; WS_TILEDWINDOW+
			250,100,306,60, \
			NULL,NULL, \
			hInst,NULL
    mov   hwnd,eax
    mov   HWNDParent, eax
    invoke GetMenu, eax
    mov hMenu, eax
    invoke ShowWindow, hwnd,SW_SHOWNORMAL 
    invoke UpdateWindow, hwnd

	invoke GetCurrentDirectory, sizeof CheminFichier, addr CheminFichier

	.WHILE TRUE
                INVOKE GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                .if hwndDlg!=0 || hwndDlg2!=0
                        invoke IsDialogMessage,hwndDlg,ADDR msg
                        .if eax==TRUE
                                .continue
                        .endif
                        invoke IsDialogMessage,hwndDlg2,ADDR msg
                        .if eax==TRUE
                                .continue
                        .endif        
	          .endif
                INVOKE TranslateMessage, ADDR msg
                INVOKE DispatchMessage, ADDR msg
	.ENDW
	mov     eax,msg.wParam
	ret
WinMain endp 



WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
LOCAL	rect:RECT

	.IF uMsg==WM_DESTROY 
		invoke PostQuitMessage,NULL 

	.ELSEIF uMsg==WM_COMMAND 
		mov eax,wParam 
		.IF ax==IDM_TEST
			.if langage != 40Ch
				invoke CreateDialogParam,hInstance, addr DlgNameA,hWnd,OFFSET DlgProc,NULL	; ListView1
			.else
				invoke CreateDialogParam,hInstance, addr DlgName,hWnd,OFFSET DlgProc,NULL	; ListView1
			.endif
			mov hwndDlg,eax											; 
			invoke SendMessage, hwndDlg, WM_MOVE, 0, 0
			invoke SendMessage, hwndDlg2, WM_CLOSE, NULL, NULL
			invoke SendMessage, hwndDlgLV2, WM_CLOSE, NULL, NULL
		.ELSEIF ax==IDM_OUVRIR
			invoke OuvrirFichier,hWnd		;*****************************************
		.ELSEIF ax==IDM_INFO
			.if langage != 40Ch
				invoke MessageBox, 0, addr InfoA, addr AppName, 44h			
			.else
				invoke MessageBox, 0, addr Info, addr AppName, 44h
			.endif
			cmp eax, 6
			jne non
			call FichierAddFunc
			non:
		.ELSEIF ax==ID_BOUTON
			.if langage != 40Ch
				invoke MessageBox, 0, addr CreateurA, addr AppName, 0
			.else
				invoke MessageBox, 0, addr Createur, addr AppName, 0
			.endif
		.ELSEIF ax==IDM_RCH1
			.if langage != 40Ch
				invoke CreateDialogParam,hInstance, addr DlgName2A,hWnd,OFFSET DlgProc2,NULL	; Dial Recherche
			.else
				invoke CreateDialogParam,hInstance, addr DlgName2,hWnd,OFFSET DlgProc2,NULL	; Dial Recherche
			.endif
			mov hwndDlg2,eax											; 
			invoke SendMessage, eax, WM_MOVE, 10, 10
			invoke SendMessage, hwndDlg, WM_CLOSE, NULL, NULL
			invoke SendMessage, hwndDlgLV2, WM_CLOSE, NULL, NULL
		.ELSEIF ax==IDM_RCHLISTVIEW2
			.if langage != 40Ch
				invoke CreateDialogParam,hInstance, addr DlgNameLV2A,hWnd,OFFSET DlgProcLV2,NULL	; ListView2 Rech
			.else
				invoke CreateDialogParam,hInstance, addr DlgNameLV2,hWnd,OFFSET DlgProcLV2,NULL	; ListView2 Rech
			.endif
			mov hwndDlgLV2,eax											; 
			invoke SendMessage, hwndDlgLV2, WM_MOVE, 0, 0
			invoke SendMessage, hwndDlg, WM_CLOSE, NULL, NULL
			invoke SendMessage, hwndDlg2, WM_CLOSE, NULL, NULL
		.ELSE 
			invoke DestroyWindow,hWnd 
		.ENDIF
	.ELSEIF uMsg==WM_CREATE
		invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR slBouton,addr szMsg,\
                	WS_VISIBLE or WS_CHILDWINDOW or \
                	ES_AUTOHSCROLL or ES_NOHIDESEL,\
              	0,0,300,17,hWnd,ID_BOUTON,hInstance,NULL
	.ELSEIF uMsg==WM_MOVE
		invoke GetWindowRect, hwndDlg, addr rect
		mov ecx, rect.right						; ecx =
		sub ecx, rect.left						; Largeur de la fenêtre ListView
		push ecx
		mov ebx, rect.bottom						; ebx =
		sub ebx, rect.top							; Hauteur de la fenêtre ListView
		invoke GetWindowRect, HWNDParent, addr rect
		pop ecx
		invoke MoveWindow, hwndDlg, rect.left,rect.bottom,ecx, ebx, TRUE
		;-- idem pour la DialoBox de recherche --
		invoke GetWindowRect, hwndDlg2, addr rect
		mov ecx, rect.right						; ecx =
		sub ecx, rect.left						; Largeur de la fenêtre De Recherche
		push ecx
		mov ebx, rect.bottom						; ebx =
		sub ebx, rect.top							; Hauteur de la fenêtre De Recherche
		invoke GetWindowRect, HWNDParent, addr rect
		pop ecx
		invoke MoveWindow, hwndDlg2, rect.left,rect.bottom,ecx, ebx, TRUE
		;-- idem pour la ListBox de recherche --
		invoke GetWindowRect, hwndDlgLV2, addr rect
		mov ecx, rect.right						; ecx =
		sub ecx, rect.left						; Largeur de la fenêtre De Recherche
		push ecx
		mov ebx, rect.bottom						; ebx =
		sub ebx, rect.top							; Hauteur de la fenêtre De Recherche
		invoke GetWindowRect, HWNDParent, addr rect
		pop ecx
		invoke MoveWindow, hwndDlgLV2, rect.left,rect.bottom,ecx, ebx, TRUE
	;.ELSEIF uMsg==WM_CLOSE
	;	invoke EndDialog,hWnd,NULL
	;	mov hwndDlg,0
	.ELSE 
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam 
		ret 
	.ENDIF
	xor    eax,eax 
	ret 
WndProc endp 







OuvrirFichier proc uses edi  hDlg:DWORD
	LOCAL seh:SEH
	mov ofn.lStructSize,SIZEOF ofn
	mov  ofn.lpstrFilter, OFFSET FilterString
	;mov  ofn.lpstrFile, OFFSET buffer
	mov  ofn.lpstrFile, OFFSET NomProgramme
	mov  ofn.nMaxFile,512
	mov  ofn.Flags, OFN_FILEMUSTEXIST or \
                       OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
                       OFN_EXPLORER or OFN_HIDEREADONLY
	invoke GetOpenFileName, ADDR ofn
	.if eax==TRUE
		invoke CopyFile, addr NomProgramme, offset Copie, FALSE
	    	;invoke lstrcpy, addr NomProgramme, addr buffer
		;invoke CreateFile, addr buffer, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
		invoke CreateFile, addr NomProgramme, GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
		.if eax!=INVALID_HANDLE_VALUE
			mov hFile, eax
 			;invoke lstrcpy, addr NomProgramme, addr buffer
			invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE,0,0,0
			.if eax!=NULL
				mov hMapping, eax
				invoke MapViewOfFile,hMapping,FILE_MAP_WRITE,0,0,0
				.if eax!=NULL
					mov pMapping,eax
					assume fs:nothing
					push fs:[0]
					pop seh.PrevLink
					mov seh.CurrentHandler,offset SEHHandler
					mov seh.SafeOffset,offset _FinalExit
					lea eax,seh
					mov fs:[0], eax
					mov seh.PrevEsp,esp
					mov seh.PrevEbp,ebp
					mov edi, pMapping
					assume edi:ptr IMAGE_DOS_HEADER
					.if [edi].e_magic==IMAGE_DOS_SIGNATURE
						add edi, [edi].e_lfanew
						assume edi:ptr IMAGE_NT_HEADERS
						.if [edi].Signature==IMAGE_NT_SIGNATURE
							mov ValidPE, TRUE
						.else
							mov ValidPE, FALSE
						.endif
					.else
						mov ValidPE,FALSE
					.endif
_FinalExit:
					push seh.PrevLink
					pop fs:[0]
					.if ValidPE==TRUE
						invoke SectionPiti		;*****************************
						invoke EcrireDonnees, eax	;*****************************
						.if langage != 40Ch
							invoke MessageBox, 0, addr LoaderA, addr AppName, 40h				
						.else
							invoke MessageBox, 0, addr Loader, addr AppName, 40h
						.endif
					.else
						invoke MessageBox,0, addr FileInValidPE, addr AppName,MB_OK+MB_ICONERROR
					.endif
					invoke UnmapViewOfFile, pMapping
				.else
					invoke MessageBox, 0, addr FileMappingError, addr AppName,MB_OK+MB_ICONERROR
				.endif
				invoke CloseHandle,hMapping
			.else
				invoke MessageBox, 0, addr FileOpenMappingError, addr AppName,MB_OK+MB_ICONERROR
			.endif
			invoke CloseHandle, hFile
		.else
			invoke MessageBox, 0, addr FileOpenError, addr AppName, MB_OK+MB_ICONERROR
		.endif
	.endif	
	ret
OuvrirFichier endp




;############################################ ON RAJOUTE LA SECTION PITI #################################################
SectionPiti	proc uses esi edi

	mov edi, pMapping
	assume edi:ptr IMAGE_DOS_HEADER 
	add edi, [edi].e_lfanew 
	assume edi:ptr IMAGE_NT_HEADERS

	mov eax, [edi].OptionalHeader.ImageBase
	mov ImageBase, eax

	mov eax, [edi].OptionalHeader.AddressOfEntryPoint
	mov AddressOfEntryPoint, eax

	movzx eax, [edi].FileHeader.NumberOfSections
	mov NumberOfSections, eax
	inc NumberOfSections				;
	mov eax, NumberOfSections			; on rajoute une section
	mov [edi].FileHeader.NumberOfSections, ax		;
							
	mov eax, [edi].OptionalHeader.SectionAlignment	; 1000
	mov SectionAlignment, eax			; 
	
	mov eax, [edi].OptionalHeader.FileAlignment	; 200
	mov FileAlignment, eax				; 
							
	mov esi, edi
	assume esi:ptr IMAGE_NT_HEADERS		; esi représente la srtucture assume IMAGE_NT_HEADERS
	
	add edi, sizeof IMAGE_NT_HEADERS		; edi pointe sur la première table des section
	assume edi:ptr IMAGE_SECTION_HEADER
	;push edi					; je le sauve parce que j'aurai de retour besoin qu'il repointe sur la première table des sections

	;---------------------------------------------------------------
	mov eax, NumberOfSections
	sub eax, 2
	mov ebx, sizeof IMAGE_SECTION_HEADER
	mul ebx							; eax = taille de toutes les sections - Les 2 dernières
	add edi, eax						; edi pointe<sur le début de l'avant dernière section
	mov eax, [edi].VirtualAddress
	mov VirtualAddress, eax			; on récupère le VirtualAddress de la dernière section

	mov eax, [edi].Misc.VirtualSize
	mov VirtualSize, eax				; on récupère le VirtualSize de la dernière section

	mov eax, [edi].PointerToRawData
	mov PointerToRawData, eax			; on récupère le RawAddress de la dernière section

	mov eax, [edi].SizeOfRawData
	mov SizeOfRawData, eax			; on récupère le SizeOfRawData de la dernière section

add edi, sizeof IMAGE_SECTION_HEADER

	mov eax, VirtualAddress			; 
	mov ebx, VirtualSize				; 
	add ebx, eax				; 
	.while eax < ebx				; 
		add eax, SectionAlignment		; 
	.endw					; 
	mov [edi].VirtualAddress, eax			; on definit le VirtualAddress de notre section
	mov VirtualAddress, eax

	mov eax, PointerToRawData			;
	mov ebx, SizeOfRawData			;
	add ebx, eax				;
	.while eax < ebx				;
		add eax, FileAlignment			;
	.endw					;
	mov [edi].PointerToRawData, eax			; on definit le PointerToRawData de notre section
	mov PointerToRawData, eax

	mov edx, 1000h		 				; taille_necessaire = tant que la taille nécessaire < eax alors
	xor eax, eax						; on augmente eax d'autant de fois FileAlignment
	.while eax < edx						; 
		add eax, FileAlignment				; 
	.endw								;
	mov [edi]. SizeOfRawData, eax				;
	mov SizeOfRawData, eax
	mov [edi].Misc.VirtualSize, eax			; On récupère la valeur de SizeOfImage du programme et je
	mov edx, [esi].OptionalHeader.SizeOfImage		; l'augmente d'autant que ma nouvelle section prend de place
	add edx, eax						; 
	mov  [esi].OptionalHeader.SizeOfImage, edx	;
 
	
	mov [edi].Characteristics, 0E0000060h		; On met cette nouvelle section en tant qu'accès en lecture et ecriture
	mov dword ptr [edi], "tip."			; 
	mov word ptr [edi+4], "ti"			; On renomme cette section sous le nom .libre 
	;---------------------------------------------------------------	

	invoke UnmapViewOfFile, pMapping
	invoke CloseHandle,hMapping
	mov eax, PointerToRawData				; eax vaut
	add eax, SizeOfRawData					; maintenant le nb de byte total du fichier = taille de fichier
	invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE,0, eax ,0    ; Nouvelle Taille du programme en entier
	mov hMapping, eax
	invoke MapViewOfFile,hMapping,FILE_MAP_WRITE,0,0,0
	mov pMapping, eax

	push edi
	invoke RVAToOffset, pMapping, [edi].VirtualAddress 	; On transforme ce RVA en adresse mémoire (dans le fichier mappé)
	add eax, pMapping						; eax pointe sur l'adresse en mémoire où commence notre nouvelle section
	mov edx, SizeOfRawData					; 


	.while edx > 0						; Et on remplit en mémoire notre nouvelle section .idata de bytes NULLs
		mov byte ptr [eax+edx-1], 00h			; Car si on ne la définit pas, elle ne sera pas modifiée une fois qu'on
		dec edx						; 
	.endw

	pop edi



	invoke RVAToOffset,pMapping, [edi].VirtualAddress 
	add eax,pMapping
	mov ebx, eax
	
	mov edi, pMapping
	assume edi:ptr IMAGE_DOS_HEADER 
	add edi, [edi].e_lfanew 
	assume edi:ptr IMAGE_NT_HEADERS
	mov eax, VirtualAddress					; Redirection de l'EntryPoint sur
	mov [edi].OptionalHeader.AddressOfEntryPoint, eax	; le début de la section .pitit
	
	mov eax, ebx
		
ret
SectionPiti endp
;#########################################################################################################################



;################################################ ECRIRE LE LOADER #######################################################
; 
; Cette procédure écrit un loader à l'intérieur du programme cible. Quand la cible sera lancée, ce loader 
; sera le premier exécuté. Il aura pour mission de retrouver les adresses des fonctions LoadLibrary
; et GetProcAdress puis d'écrire les noms des fonctions et DLL que vous aurez peut-être placées dans le
; fichier AddFunc.ini puis il retrouvera les adresses de chacune de ses nouvelles fonctions
; 
EcrireDonnees proc uses esi edi debutEcriture:DWORD
LOCAL debutSection	:DWORD
LOCAL DLLnum		:DWORD
LOCAL FUNCnum		:DWORD
LOCAL NomFichier[100]	:BYTE

;------------
jmp data@1
	DLL		db "DLL", 0
	DLLD		db "DLLD",0
	F		db "F",0
	NFichier	db "\AddFunc.ini",0
data@1:	
;------------
invoke lstrcpy, addr NomFichier, addr CheminFichier
invoke lstrcat, addr NomFichier, addr NFichier

NOP
mov edi, debutEcriture			;
mov byte ptr [edi], 068h	  	; 
inc edi					; push ADDRESSE_DE_D2BUT_DE_LA_SECTION
mov eax, ImageBase			; 
add eax, VirtualAddress			;  
mov debutSection, eax			; debutSection est le point de référence de la nouvelle section
mov dword ptr [edi], eax		; ex:
add edi, 4h					; 6800504000	PUSH 00405000


mov byte ptr [edi], 05Fh		; 5F 			POP EDI
inc edi					; 
mov dword ptr [edi], 0000141E9h	; 	JMP EIP+141   donc ici CODE commence en 00404901
add edi, 4					;
mov byte ptr [edi], 00h			;
inc edi					;
							; ******* LES DATA *******
mov dword ptr [edi], 06E72654Bh	; 
add edi, 4					; Kernel32.dll
mov dword ptr [edi], 032336C65h	; 
add edi, 4					; 
mov dword ptr [edi], 06C6C642Eh	; 
add edi, 4					;
mov byte ptr [edi], 00			; (Null de terminaison)
inc edi					;

mov dword ptr [edi], 064616F4Ch	; 
add edi, 4					; LoadLibraryA
mov dword ptr [edi], 07262694Ch	; 
add edi, 4					; 
mov dword ptr [edi], 041797261h	; 
add edi, 4					; 
mov dword ptr [edi], 074654700h	; (Null de terminaison)
add edi, 4					; 
mov dword ptr [edi], 0636F7250h	;
add edi, 4					; GetProcAddress
mov dword ptr [edi], 072646441h	;
add edi, 4					;
mov dword ptr [edi], 000737365h	; (Null de terminaison)
add edi, 4					;
mov dword ptr [edi], 04D746547h	;
add edi, 4					;
mov dword ptr [edi], 06C75646Fh	;
add edi, 4					;
mov dword ptr [edi], 06E614865h	;
add edi, 4					;
mov dword ptr [edi], 041656C64h	;
add edi, 4					;
mov byte ptr [edi], 0			; (Null de terminaison)


;--------

mov edi, debutEcriture	;<-- debut de la nouvelle section dans le programme cible
add edi, 060h				
; ********************************************* PARTIE CODE ********************************************************
mov byte ptr [edi], 055h		; PUSH EBP
inc edi					; 					;*************************;
mov word ptr [edi], 0EC8Bh		; MOV EBP, ESP			; Procédure GetKernelBase ;
add edi, 2					;					;*************************;
mov byte ptr [edi], 056h		; PUSH ESI
mov byte ptr [edi+1], 057h		; PUSH EDI
mov dword ptr [edi+2], 081087D8Bh	; MOV EDI, DWORD PTR [EBP+08]
mov byte ptr [edi+6], 0E7h		;
mov dword ptr [edi+7], 0FFFF0000h	; AND EDI, 0000FFFFh
mov byte ptr [edi+11], 066h		;
mov dword ptr [edi+12], 05A4D3F81h	; CMP WORD PTR [EDI], 5A4D
mov word ptr [edi+16], 00E75h		; JNE QUIT					(saut vers QUIT)
mov word ptr [edi+18], 0F78Bh		; MOV ESI, EDI
mov byte ptr [edi+20], 03h		;
mov word ptr [edi+21], 03C76h		; ADD ESI, DWORD PTR [ESI+3C]
mov byte ptr [edi+23], 066h		; 
mov dword ptr [edi+24], 045503E81h	; CMP DWORD PTR [ESI], 4550
mov word ptr [edi+28], 00275h		; JNE QUIT					(saut vers QUIT)
mov word ptr [edi+30], 017EBh		; JMP 00401153
mov word ptr [edi+32], 0EF81h		;						(QUIT:)
mov dword ptr [edi+34], 00010000h	; SUB EDI, 00010000
mov word ptr [edi+38], 0FF81h		;
mov dword ptr [edi+40], 070000000h	; CMP EDI, 70000000
mov word ptr [edi+44], 0772h		; JB 00401151
mov byte ptr [edi+46], 0BFh		;
mov dword ptr [edi+47], 0BFF70000h	; MOV EDI, BFF70000
mov word ptr [edi+51], 02EBh		; JMP 00401153				
mov word ptr [edi+53], 0D4EBh		; JMP 00401127
mov byte ptr [edi+55], 097h		; XCHG EAX, EDI				
mov byte ptr [edi+56], 05Fh		; POP EDI
mov byte ptr [edi+57], 05Eh		; POP ESI
mov dword ptr [edi+58], 0004C2C9h	; LEAVE & RET 0004

add edi, 62 ;
mov dword ptr [edi], 090909090h	; NOP NOP NOP NOP	;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

mov byte ptr [edi+4], 055h		; PUSH EBP							;**************************;
mov word ptr [edi+5], 0EC8Bh		; MOV EBP, ESP						; Procédure GetProcAddress ;
mov dword ptr [edi+7], 053515756h	; PUSH ESI, EDI, ECX, EBX				;**************************;
mov dword ptr [edi+11], 008758B52h	; PUSH EDX		MOV ESI, DWORD PTR [EBP+08]
mov byte ptr [edi+15], 066h		;
mov dword ptr [edi+16], 05A4D3E81h	; CMP WORD PTR [ESI], 5A4D
mov word ptr [edi+20], 0850Fh		;
mov dword ptr [edi+22], 00000082h	; JNE 004011F2
mov byte ptr [edi+26], 03h		;
mov word ptr [edi+27], 03C76h		; ADD ESI, DWORD PTR [ESI+3C]
mov word ptr [edi+29], 03E81h		;
mov dword ptr [edi+31], 00004550h	; CMP DWORD PTR [ESI], 00004550
mov word ptr [edi+35], 07775h		; JNE 004011F2
mov dword ptr [edi+37], 0B90C7D8Bh	; MOV EDI, DWORD PTR [EBP+0C]
mov dword ptr [edi+41], 00000096h	; MOV ECX, 00000096
mov word ptr [edi+45], 0C032h		; XOR AL, AL
mov word ptr [edi+47], 0AEF2h		; REPNZ & SCASB
mov word ptr [edi+49], 0CF8Bh		; mov ecx, edi
mov dword ptr [edi+51], 08B0C4D2Bh	; sub ecx, dword ptr [ebp+0C]
mov dword ptr [edi+55], 055037856h	; mov edx, dword ptr [esi+78]
mov dword ptr [edi+59], 0205A8B08h	; add edx, dword ptr [ebp+08]
mov byte ptr [edi+63], 03h		; mov ebx, dword ptr [edx+20]
mov word ptr [edi+64], 085Dh		; add ebx, dword ptr [ebp+08]
mov word ptr [edi+66], 0C033h		; xor eax, eax
mov word ptr [edi+68], 03B8Bh		; mov edi, dword ptr [ebx]
mov word ptr [edi+70], 07D03h		; add edi, dword ptr [ebp+08]
mov dword ptr [edi+72], 0C758B08h	; mov esi, dword ptr [ebp+0C]
mov word ptr [edi+76], 0F351h		; push ecx & repz
mov dword ptr [edi+78], 00F983A6h   ; cmpsb &  cmp ecx, 00000000
mov word ptr [edi+82], 0575h		; jne 004011AF
mov byte ptr [edi+84], 83h		;
mov word ptr [edi+85], 04C4h		; add esp, 00000004
mov word ptr [edi+87], 0AEBh		; jmp 004011B9
mov byte ptr [edi+89], 059h		; pop ecx
mov dword ptr [edi+90], 04004C383h	; add ebx, 00000004 & inc eax
mov dword ptr [edi+94], 07518423Bh	; cmp eax, dword ptr [edx+18]
mov dword ptr [edi+98], 018423BE1h	; jne 0040119A	&	cmp eax, dword ptr [edx+18]
mov word ptr [edi+102], 0275h		; jne 004011C0
mov word ptr [edi+104], 032EBh	; jmp 004011F2
mov dword ptr [edi+106], 0324728Bh	; mov esi, dword ptr [edx+24]
mov word ptr [edi+110], 0875h		; add esi, dword ptr [ebp+08]
mov word ptr [edi+112], 0BB52h	; push edx
mov dword ptr [edi+114], 00000002h	; mov ebx, 00000002
mov word ptr [edi+118], 0D233h	; xor edx, edx
mov word ptr [edi+120], 0E3F7h	; mul ebx
mov byte ptr [edi+122], 05Ah		; pop edx
mov word ptr [edi+123], 0C603h	; add eax, esi
mov word ptr [edi+125], 0C933h	; xor ecx, ecx
mov byte ptr [edi+127], 066h		; 
mov word ptr [edi+128], 088Bh		; mov cx, word ptr [eax]
mov byte ptr [edi+130], 08Bh		;
mov word ptr [edi+131], 01C7Ah	; mov edi, dword ptr [edx+1C]
mov word ptr [edi+133], 0D233h	; xor edx, edx
mov byte ptr [edi+135], 0BBh		;
mov dword ptr [edi+136], 00000004h	; mov ebx, 00000004
mov word ptr [edi+140], 0C18Bh	; mov eax, ecx
mov word ptr [edi+142], 0E3F7h	; mul ebx
mov byte ptr [edi+144], 03h		; 
mov word ptr [edi+145], 0845h		; add eax, dword ptr [ebp+08]
mov word ptr [edi+147], 0C703h	; add eax, edi
mov word ptr [edi+149], 008Bh		; mov eax, dword ptr [eax]
mov byte ptr [edi+151], 03h		; 
mov word ptr [edi+152], 0845h		; add eax, dword ptr [ebp+08]
mov word ptr [edi+154], 02EBh		; jmp 004011F4
mov word ptr [edi+156], 0C033h	; xor eax, eax
mov byte ptr [edi+158], 05Ah		; pop edx
mov dword ptr [edi+159], 05E5F595Bh	; pop ebx & pop ecx & pop edi & pop esi
mov dword ptr [edi+163], 0008C2C9h	; leave & ret 0008
mov dword ptr [edi+167], 090909090h	; NOP NOP NOP NOP

add edi, 171
;************************************************************** Fin des Procédures **************************************

mov word ptr [edi], 0C78Bh		; MOV EAX, EDI (edi = début de la section .pitit
mov byte ptr [edi+2], 05h
mov dword ptr [edi+3], 000000060h	; ADD EAX, 60h
mov word ptr [edi+7], 0D0FFh		; CALL EAX (avec eax qui pointe sur la Procédure GetKernelBase) en retour eax = handle Kernel32.dll
mov word ptr [edi+9], 0DF8Bh		; MOV EBX, EDI
mov word ptr [edi+11], 8350h		; PUSH EAX
mov word ptr [edi+13], 018C3h		; ADD EBX, 18h
mov word ptr [edi+15], 05053h		; PUSH EBX & PUSH EAX
mov word ptr [edi+17], 0C78Bh		; MOV EAX, EDI
mov byte ptr [edi+19], 05		;
mov dword ptr [edi+20], 000000A5h	; ADD EAX, 0A5h
mov word ptr [edi+24], 0D0FFh		; CALL EAX (avec eax qui pointe sur la procédure GetProcAddress) en retour eax = adresse LoadLibraryA		
mov word ptr [edi+26], 0DF8Bh		; MOV EBX, EDI
mov byte ptr [edi+28], 083h		;
mov word ptr [edi+29], 045C3h		; ADD EBX, 45h
mov word ptr [edi+31], 00389h		; MOV DWORD PTR [EBX], EAX    (inscription de l'adresse de LoadLibraryA)
mov byte ptr [edi+33], 058h		; POP EAX
mov byte ptr [edi+34], 050h		; PUSH EAX
mov word ptr [edi+35], 0DF8Bh		; MOV EBX, EDI
mov byte ptr [edi+37], 083h		;
mov word ptr [edi+38], 025C3h		; ADD EBX, 25h
mov word ptr [edi+40], 05053h		; PUSH EBX & PUSH EAX
mov word ptr [edi+42], 0C78Bh		; MOV EAX, EDI
mov byte ptr [edi+44], 05		;
mov dword ptr [edi+45], 0000000A5h	; ADD EAX, 0A5h
mov word ptr [edi+49], 0D0FFh		; CALL EAX (avec eax qui pointe sur la procédure GetProcAddress) en retour eax = adresse GetProcAddress
mov word ptr [edi+51], 0DF8Bh		; MOV EBX, EDI
mov byte ptr [edi+53], 083h		;
mov word ptr [edi+54], 049C3h		; ADD EBX, 49h
mov word ptr [edi+56], 00389h		; MOV DWORD PTR [EBX], EAX
mov byte ptr [edi+58], 058h		; POP EAX

mov word ptr [edi+59], 0DF8Bh		; MOV EBX, EDI
mov byte ptr [edi+61], 083h		;
mov word ptr [edi+62], 034C3h		; ADD EBX, 34h
mov word ptr [edi+64], 05053h		; PUSH EBX & PUSH EAX
mov word ptr [edi+66], 0C78Bh		; MOV EAX, EDI
mov byte ptr [edi+68], 05		;
mov dword ptr [edi+69], 0000000A5h	; ADD EAX, 0A5h
mov word ptr [edi+73], 0D0FFh		; CALL EAX (avec eax qui pointe sur la procédure GetProcAddress) en retour eax = adresse GetModileHandleA
mov word ptr [edi+75], 0DF8Bh		; MOV EBX, EDI
mov byte ptr [edi+77], 083h		;
mov word ptr [edi+78], 04DC3h		; ADD EBX, 4Dh
mov word ptr [edi+80], 00389h		; MOV DWORD PTR [EBX], EAX

add edi, 82

;____________________________ 0-82d+31d+100h
push edi
mov esi, edi
add esi, 0A7h	; A7h bytes plus loin = soit 200h bytes après l'inscription du dword de LoadLibraryA
mov edi, esi

mov DLLnum, 0
LesDLL:   
	inc DLLnum
	invoke Deci2Char, DLLnum
	invoke lstrcpy, addr Buffer, addr DLL
	invoke lstrcat, addr Buffer, addr nombreHChar
	invoke GetPrivateProfileString, addr DLL, addr Buffer, addr erreur, addr BufferDLL, sizeof BufferDLL, addr NomFichier
	cmp dword ptr [BufferDLL], ">--<"
	je saute1
	;----------------------
	invoke lstrlen, offset DLLD
	inc eax
	mov ecx, eax				; ecx = nb de caractères à recopier
	;mov edi, esi				; edi = adresse où sera recopier la chaine de caractères
	mov esi, offset DLLD			; esi = pointe sur la chaine à recopier
	rep movsb	
	invoke lstrlen, offset BufferDLL
	inc eax
	mov ecx, eax				; ecx = nb de caractères à recopier
	;mov edi, esi				; edi = adresse où sera recopier la chaine de caractères
	mov esi, offset BufferDLL		; esi = pointe sur la chaine à recopier
	rep movsb
	;----------------------
	saute1:
	mov FUNCnum, 0
	LesFonc:		
		inc FUNCnum
		invoke Deci2Char, FUNCnum
		invoke lstrcpy, addr Buffer, addr F
		invoke lstrcat, addr Buffer, addr nombreHChar
		invoke GetPrivateProfileString, addr BufferDLL, addr Buffer, addr erreur, addr BufferFonction, sizeof BufferFonction, addr NomFichier
		cmp dword ptr [BufferFonction], ">--<"
		je saute2
			;----------------------
			invoke lstrlen, offset BufferFonction
			inc eax
			mov ecx, eax				; ecx = nb de caractères à recopier
			;mov edi, esi				; edi = adresse où sera recopier la chaine de caractères
			mov esi, offset BufferFonction	; esi = pointe sur la chaine à recopier
			rep movsb
			add edi, 4
			;invoke MessageBox, 0, addr BufferFonction, addr BufferDLL, 0
			;----------------------
		saute2:
	cmp dword ptr [BufferFonction], ">--<"
	jne LesFonc
cmp dword ptr [BufferDLL], ">--<"
jne LesDLL

;-----------

pop edi
mov word ptr [edi], 09090h			; NOP & NOP
mov esi, debutSection
add esi, 0245h
mov byte ptr [edi+2], 068h			; PUSH... 
mov dword ptr [edi+3], esi			; ...	ADRESSE
mov byte ptr [edi+7], 05Bh			; POP ebx
mov word ptr [edi+8], 0C38Bh			; mov eax, ebx
mov word ptr [edi+10], 03881h
mov dword ptr [edi+12], 0444C4C44h     	; cmp dword ptr [eax], 444C4C44
mov word ptr [edi+16], 01D75h			; jne 0040102E
mov byte ptr [edi+18], 083h
mov word ptr [edi+19], 005C0h			; add eax, 00000005
mov word ptr [edi+21], 0D88Bh			; mov ebx, eax
mov byte ptr [edi+23], 043h			; inc ebx
mov byte ptr [edi+24], 080h
mov word ptr [edi+25], 0003Bh			; cmp byte ptr [ebx], 00
mov word ptr [edi+27], 0FA75h			; jne 00401016
mov word ptr [edi+29], 05043h			; inc ebx & push eax

mov esi, debutSection
add esi, 045h			; esi pointe sur l'adresse de LoadLibrary

mov byte ptr [edi+31], 0BEh			; MOV ESI,....
mov dword ptr [edi+32], esi			; ...	ADRESSE
mov word ptr [edi+36], 016FFh			; CALL DWORD PTR [ESI]		=  Call _LoadLibraryA

mov byte ptr [edi+38], 083h
mov word ptr [edi+39], 000F8h			; cmp eax, 00000000
mov word ptr [edi+41], 02274h			; je 0040104A
mov word ptr [edi+43], 0C88Bh			; mov ecx, eax
mov word ptr [edi+45], 0D9EBh			; jmp 00401007
mov word ptr [edi+47], 08043h			; inc ebx
mov word ptr [edi+49], 0003Bh			; cmp byte ptr [ebx], 00
mov word ptr [edi+51], 0FA75h			; jne 0040102E
mov word ptr [edi+53], 05143h			; inc ebx & push ecx
mov word ptr [edi+55], 05150h			; push eax & push ecx

mov esi, debutSection
add esi, 049h			; esi pointe sur l'adresse de GetProcAddress

mov byte ptr [edi+57], 0BEh			; MOV ESI,....
mov dword ptr [edi+58], esi			; ...	ADRESSE
mov word ptr [edi+62], 016FFh			; CALL DWORD PTR [ESI]		=  Call _GetProcAddress
mov byte ptr [edi+64], 083h
mov word ptr [edi+65], 000F8h			; cmp eax, 00000000
mov word ptr [edi+67], 00874h			; je 0040104A
mov byte ptr [edi+69], 059h			; pop ecx
mov word ptr [edi+70], 00389h			; mov dword ptr [ebx], eax
mov byte ptr [edi+72], 083h
mov word ptr [edi+73], 004C3h			; add ebx, 00000004
mov word ptr [edi+75], 0BBEBh			; jmp 00401007

add edi, 77
;____________________________


mov byte ptr [edi], 0B8h		; mov eax, ...
mov eax, ImageBase			;
add eax, AddressOfEntryPoint		;
inc edi					;
mov dword ptr [edi], eax		; ...EntryPoint
mov word ptr [edi+4], 0E0FFh		; jmp eax
ret
EcrireDonnees endp
;#########################################################################################################################


;############################################## Fonction AddFunc.ini #####################################################
FichierAddFunc proc near
LOCAL NomFichier[100]		:BYTE
jmp data2@
	AFichier	db "AddFunc.ini",0
	Contenu1	db "DLL",0
	Contenu2	db "DLL1",0
	Contenu22	db "Nom_de_la_DLL_1.dll",0
	Contenu3	db "DLL2",0
	Contenu32	db "Nom_de_la_DLL_2.dll",0
	Contenu4	db "DLLn",0
	Contenu42	db "......",0

	Contenu7	db "F1",0
	Contenu72	db "Nom_de_la_Fonction1",0
	Contenu8	db "F2",0
	Contenu9	db "F3",0
	open		db "open",0
data2@:

invoke lstrcpy, addr NomFichier, addr CheminFichier
invoke lstrcat, addr NomFichier, addr NFichier
invoke DeleteFile, addr NomFichier
invoke WritePrivateProfileString, addr Contenu1, addr Contenu2, addr Contenu22, addr NomFichier
invoke WritePrivateProfileString, addr Contenu1, addr Contenu3, addr Contenu32, addr NomFichier
invoke WritePrivateProfileString, addr Contenu1, addr Contenu4, addr Contenu42, addr NomFichier
invoke WritePrivateProfileString, addr Contenu22, addr Contenu7, addr Contenu72, addr NomFichier
invoke WritePrivateProfileString, addr Contenu22, addr Contenu8, addr Contenu42, addr NomFichier
invoke WritePrivateProfileString, addr Contenu32, addr Contenu7, addr Contenu72, addr NomFichier
invoke WritePrivateProfileString, addr Contenu32, addr Contenu8, addr Contenu42, addr NomFichier
invoke WritePrivateProfileString, addr Contenu32, addr Contenu9, addr Contenu42, addr NomFichier
invoke ShellExecute, 0, addr open, addr NomFichier, NULL, NULL, SW_SHOWNORMAL 
ret
FichierAddFunc endp
;#########################################################################################################################




DlgProc2 PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM
LOCAL	rect:RECT
        .if iMsg==WM_INITDIALOG
		invoke GetDlgItem,hWnd,IDC_EDIT
		mov hEdit, eax
		invoke SetFocus,hEdit
		invoke SetWindowText, hEdit, addr etoile
        .elseif iMsg==WM_COMMAND
		mov eax,wParam
		mov edx,eax
		shr edx,16
		.if dx==BN_CLICKED
			.if eax==IDC_EXIT
				invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
			.elseif eax==IDC_BUTTON

				invoke CreateWindowEx,NULL,ADDR ProgressClass,NULL, WS_CHILD+WS_VISIBLE, 4, 6, 290, 22,hWnd,IDC_PROGRESS, hInstance,NULL 
				mov hwndProgress,eax 
				mov eax,100 ; Le paramètre lParam du message PBM_SETRANGE contient la gamme, (en général de 0 à 100) 
				shl eax,16 ; La borne haute de la gamme (ici 100) est dans le mot de poids fort 
				invoke SendMessage,hwndProgress,PBM_SETRANGE,0,eax 
				invoke SendMessage,hwndProgress,PBM_SETPOS,0,0

				invoke GetWindowText, hEdit, addr BufferFonction, 50
				invoke lcase, addr BufferFonction
				invoke SendMessage,HWNDParent,WM_COMMAND, IDM_RCHLISTVIEW2, NULL
				invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
			.elseif eax == IDC_DLL
				call NouvelleDLL
			.endif
		.endif
	.elseif iMsg==WM_MOVE
		invoke GetWindowRect, hwndDlg2, addr rect
		mov ecx, rect.right						; ecx =
		sub ecx, rect.left						; Largeur de la fenêtre ListView
		push ecx
		mov ebx, rect.bottom						; ebx =
		sub ebx, rect.top							; Hauteur de la fenêtre ListView
		invoke GetWindowRect, HWNDParent, addr rect
		pop ecx
		invoke MoveWindow, hwndDlg2, rect.left,rect.bottom,ecx, ebx, TRUE
	.elseif iMsg==WM_CLOSE
		invoke EndDialog,hwndDlg2,NULL
		mov hwndDlg2,0	   
        .else
		mov eax,FALSE
		ret
        .endif
        mov  eax,TRUE
        ret
DlgProc2 endp


NouvelleDLL proc uses esi edi
	LOCAL NomModule[200]	:BYTE
	LOCAL numDLL		:DWORD
	LOCAL NomFichierDLL[200]:BYTE

	jmp data@9
	FilterStringDLL 		db "Dynamic Link Library (*.dll)",0,"*.dll",0 
					db "All Files",0,"*.*",0,0
	titreOpenDLL		db "Ajouter une DLL à la liste de recherche",0
	titreOpenDLLA		db "Add a DLL to the list",0
	fichierDLL			db "\_suppldll.ini",0
	data@9:

	invoke lstrcpy, addr NomFichierDLL, addr CheminFichier
	invoke lstrcat, addr NomFichierDLL, addr fichierDLL

	mov ofnDLL.lStructSize,SIZEOF ofnDLL
	mov  ofnDLL.lpstrFilter, OFFSET FilterStringDLL
	lea eax, NomModule
	mov  ofnDLL.lpstrFile, eax
	.if langage != 40Ch
		mov ofnDLL.lpstrTitle, OFFSET titreOpenDLLA
	.else
		mov ofnDLL.lpstrTitle, OFFSET titreOpenDLL
	.endif
	mov  ofnDLL.nMaxFile,512
	mov  ofnDLL.Flags, OFN_FILEMUSTEXIST or \
                       OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
                       OFN_EXPLORER or OFN_HIDEREADONLY
	invoke GetOpenFileName, ADDR ofnDLL
	.if eax==TRUE
		xor ebx, ebx
		xor edx, edx
		retourr:
		lea ecx, NomModule
		mov al, byte ptr [ecx+edx]
		mov byte ptr [NomM+ebx], al
		inc ebx
		inc edx
		cmp al, "\"
		jne rien
		xor ebx, ebx
		rien:
		cmp al, 0
		jne retourr

		mov numDLL, 0
	retourDLL_:
		inc numDLL
		invoke Deci2Char, numDLL
		invoke lstrcpy, addr Buffer, addr DLL
		invoke lstrcat, addr Buffer, addr nombreHChar
		invoke GetPrivateProfileString, addr DLL, addr Buffer, addr erreur, addr BufferDLL, sizeof BufferDLL, addr NomFichierDLL

		invoke lstrcmpi, addr BufferDLL, addr NomM
		cmp eax, 0
		je DllExisteDeja
		cmp dword ptr [BufferDLL], ">--<"
		jne retourDLL_
		invoke WritePrivateProfileString, addr DLL, addr Buffer, addr NomM, addr NomFichierDLL
		invoke WritePrivateProfileString, addr Buffer, addr NomM, addr NomModule, addr NomFichierDLL
	.endif
	DllExisteDeja:
ret
NouvelleDLL endp




lcase proc text:DWORD
    ; -----------------------------
    ; converts string to lower case
    ; invoke lcase,ADDR szString
    ; -----------------------------
    push esi
    push edi
    mov esi, text
    mov edi, text
    cld
  lcSt:
    lodsb
    cmp al, 0       ; exit on zero terminator
    je lcOut
    cmp al, "A"
    jl @F
    cmp al, "Z"
    jg @F
    add al, 32
  @@:
    stosb
    jmp lcSt
  lcOut:
    stosb
    pop edi
    pop esi
ret
lcase endp


include modules\ListView.inc
include modules\ListViewRech.inc



end start